#include "logger.h"
#include<time.h>
#include<iostream>
 Logger& Logger::GetInstance()
 {
    static Logger m_logger;
    return m_logger;
 }
 //静态函数在类外定义完需要初始化
 Logger::Logger()
 {
    //启动专门的写日志线程
    std::thread writeLogTask([&](){
        for(;;)
        {
            //获取当前的日期，接着取日志信息，写入相应的日志文件中，对于文件不存在则创建，有的话则追加 a+
            time_t now =time(nullptr);//获取的是从1970年到现在的秒数
            tm* nowTm=localtime(&now);//获取当前的时间

            char file_name[128];
            sprintf(file_name,"%d-%d-%d-log.txt",nowTm->tm_year+1900,nowTm->tm_mon+1,nowTm->tm_mday);//将格式化的字符串写入缓冲区file_name中
            FILE* pf=fopen(file_name,"a+");
            if(nullptr==pf)
            {
                std::cout<<"logger file::"<<file_name<<" open error"<<std::endl;
                exit(EXIT_FAILURE);
            }

            //此时打开文件就往里面写入就可以
            std::string msg=m_lockQueue.pop();

            char time_buf[128]={0};
            sprintf(time_buf,"%d:%d:%d => [%s]",
                    nowTm->tm_hour,
                    nowTm->tm_min,
                    nowTm->tm_sec,
                    (m_loglevel ==  INFO ? "info":"error"));
            msg.insert(0,time_buf);
            msg.append("\n");

            fputs(msg.c_str(),pf);
            fclose(pf);
        }

    });
    //设置分离线程，相当于守护线程
    writeLogTask.detach();
 }

void Logger::SetLogLevel(LogLevel level) // 设置日志的级别
{
    m_loglevel=level;
}
void Logger::Log(std::string msg) // 设置日志的信息
{
    m_lockQueue.push(msg);
}
